// 引入axios包
import axios from 'axios'
// 引入仓库实例，用于获取tokey
import store from '@/store'
// 引入路由实例，用于跳转页面
import router from '@/router'

// 请求基地址
export const baseURL = 'http://pcapi-xiaotuxian-front-devtest.itheima.net/'
// export const baseURL = 'https://apipc-xiaotuxian-front.itheima.net'
// 创建axios实例
const instance = axios.create({
  // axios 的一些配置，baseURL  timeout
  baseURL, // baseURL:baseURL配置请求基地址
  timeout: 5000000 // 请求5s超时
})
// 请求拦截器
instance.interceptors.request.use(config => {
//   获取仓库中的用户数据
  const { profile } = store.state.user
  // 判断有没有token
  if (profile.token) {
    // 把token信息添加到请求头中
    config.headers.Authorization = `Bearer ${profile.token}`
  }
  //   返回加工后的配置，用于发送请求
  return config
}, err => {
  return Promise.reject(err)
})

// 响应拦截器
instance.interceptors.response.use(
  // 请求成功后，返回res.data
  res => res.data,
  //   处理错误
  err => {
  // 后端状态码401表示用户数据无效(tokey无效)
    if (err.response && err.response.status === 401) {
    //   清空无效用户信息
      store.commit('user/setUser', {})
      // router.currentRoute 获取当前路由实例(ref响应式对象,所以获取数据的时候要多个.value)
      // fullPath 路由的完整路径(包括路由参数)
      // encodeURIComponent()  特殊符号转码，路径兼容性更好
      const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
      //   跳转到登录页并携带回调地址
      router.push('/login?redirectUrl=' + fullPath)
    }
    // 用于catch捕获错误信息
    return Promise.reject(err)
  })

// 请求工具函数
const requset = (url, method = 'get', submitData) => {
  // 负责发请求：请求地址，请求方式，提交的数据
  return instance({
    url,
    method,
    /*
       键名称[] 表示允许键名称js运算
       判断请求参数是否为 get，如果是就是用 params 作为键名称，其他情况都用 data 作为键名称
    */
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}
export default requset
